package main
import (
	"fmt"
	"encoding/json"
)
//反序列化的使用，就是序列化的逆向操作！

func main(){
	//反序列化
	unmarshalStruct()
	unmarshalMap()
	unmarshalSlice()
}
//反序列化成结构体，必须得有那个结构体！！！
type Person struct{
	Name string
	Age int
	Birthday string
	Sal float64
}
//将json字符串反序列化成结构体
func unmarshalStruct(){
	str := "{\"Name\":\"fmx\",\"Age\":22,\"Birthday\":\"1999-06-24\",\"Sal\":12000}"
	var person Person
	err := json.Unmarshal([]byte(str),&person)//反序列化
	if err != nil{
		fmt.Println("反序列化失败！Error：",err)
	}
	fmt.Println("反序列化结果：",person) //反序列化结果： {fmx 22 1999-06-24 12000}  成功!
}

//将json字符串反序列化成Map
func unmarshalMap(){
	str := "{\"age\":22,\"name\":\"fmx\",\"sal\":12000}"
	var kvmap map[string]interface{} //不需要make操作，因为反序列化会自动make，已经被封装到了Unmarshal函数中
	err := json.Unmarshal([]byte(str),&kvmap)
	if err != nil{
		fmt.Println("反序列化失败！Error：",err)
	}
	fmt.Println("反序列化结果：",kvmap)
}

//将json字符串反序列化成Slice
func unmarshalSlice(){
	str := "[{\"age\":22,\"name\":\"fmx\",\"sal\":12000},{\"age\":22,\"name\":\"lsx\",\"sal\":10000}]"
	var slice []map[string]interface{}
	err := json.Unmarshal([]byte(str),&slice)
	if err != nil{
		fmt.Println("反序列化失败！Error：",err)
	}
	fmt.Println("反序列化结果：",slice)
}

//代码小结：
/*
1、在反序列化一个json字符串时，要确保反序列化后的数据类型和原来序列化前的数据类型一致（结构体的话只需要字段完全一样！）
2、如果json字符串时通过程序本身获取得到的，不需要在对 “ 转义处理。
*/